package com.yunhe.option.repository.base;

import com.yunhe.option.domain.base.Item;
import org.springframework.data.neo4j.annotation.Query;
import org.springframework.data.neo4j.repository.Neo4jRepository;
import org.springframework.data.repository.query.Param;
import org.springframework.stereotype.Repository;

/**
 * @ClassName ItemRepository
 * @Description TODO
 * @Author HeTao
 * @Date 2021/2/26 14:54
 * @Version 1.0
 **/
@Repository
public interface ItemRepository extends Neo4jRepository<Item, Long> {
    @Query("match(e:Enum)-[:HAS_ITEM]->(i:Item) where ID(e)={enumId} return i")
    Iterable<Item> findByEnumId(@Param("enumId") Long enumId);

    @Query("match(e:Enum)-[:HAS_ITEM]->(i:Item{code:{code}}) where ID(e)={enumId} return i")
    Item findByEnumIdAndCode(@Param("enumId") Long enumId,@Param("code") String code);

    @Query("match(e:Enum)-[:HAS_ITEM]->(i:Item{code:{code}})<-[:HAS_CHILD]-(i1:Item) where ID(e)={enumId} and ID(i1)={parentId} return i")
    Item findByEnumIdAndCode(@Param("enumId") Long enumId,@Param("code") String code,@Param("parentId") Long parentId);

    @Query("start item=node({id}) match(parentItem)-[r:HAS_CHILD]->(item) delete r")
    void unbindParentItemById(@Param("id") Long id);

    @Query("start n=node({parentId}),m=node({childId}) create (n)-[:HAS_CHILD]->(m)")
    void bindChildItemById(@Param("parentId") Long parentId,@Param("childId") Long id);

    @Query("match(e:Enum),(i:Item) where ID(e)={enumId} and ID(i)={itemId} create (e)-[:HAS_ITEM]->(i)")
    void bindEnum(@Param("enumId") Long enumId,@Param("itemId") Long id);

    @Query("start parentItem=node({id}) match(parentItem)-[r:HAS_CHILD]->(item) return item")
    Iterable<Item>  findChildItemByParentId(@Param("id") Long id);

    @Query("match(e:Enum{name:{enumName}})-[:HAS_ITEM]->(i:Item)  return i")
    Iterable<Item> getItemByEnumName(@Param("enumName") String enumName);

    @Query("MATCH (e:Enum{name:{enumName}})-[:HAS_ITEM]->(i:Item) WHERE not ()-[:HAS_CHILD]->(i) WITH i " +
            "MATCH p=(i)-[:HAS_CHILD*0..9]->()  RETURN p,ID(i)")
    Iterable<Item> findItemsByEnumName(@Param("enumName") String enumName);


    @Query("match(e:Enum)-[r:HAS_ITEM]->(i:Item) where ID(i)={id} delete r")
    void unbindEnumById(@Param("id")Long id);
}
